package net.suncaper.mvc.mapper;

import net.suncaper.mvc.model.domain.Order;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * Order表数据库访问接口
 */
public interface OrderMapper {
    /**
     * 创建订单
     * 插入订单并返回自增ID（通过订单对象的id字段带回）
     * @param order 订单信息
     * @return 订单创建结果
     */
    void insertOrderAndReturnId(Order order);

    /**
     * 获取用户所有订单
     *
     * @param userId 用户ID
     * @return 订单列表
     */
    List<Order> selectUserOrders(String userId);

    /**
     * 获取所有订单
     *
     * @return 订单列表
     */
    List<Order> selectAllOrders();

    /**
     * 更新订单
     *
     * @param order 订单信息
     * @return 更新结果
     */
    boolean updateOrder(Order order);

    /**
     * 更新订单并返回更新前的订单信息（用于获取原订单的房型和酒店名称）
     * @param order 包含更新信息的订单对象（必须包含id）
     * @return 更新前的订单信息（若订单不存在则返回null）
     */
    Order updateOrderAndReturnOriginal(Order order);
    
    /**
     * 办理退房并返回更新前的订单信息（用于获取原订单的房型和酒店名称）
     * @param order 包含退房信息的订单对象（必须包含id和checkoutTime）
     * @return 更新前的订单信息（若订单不存在则返回null）
     */
    Order checkoutOrderAndReturnOriginal(Order order);

    /**
     * 根据酒店名称获取订单
     *
     * @param hotelName 酒店名称
     * @return 订单列表
     */
    List<Order> selectOrdersByHotel(String hotelName);

    /**
     * 仅更新订单支付相关字段
     * @param id            订单ID
     * @param paymentMethod 支付方式
     * @param amount        支付金额
     * @param payTime       支付时间
     * @return 更新的行数
     */
    int updateOrderForPayment(Integer id, String paymentMethod, BigDecimal amount, Date payTime);
    
    /**
     * 根据订单ID获取订单详情
     * @param orderId 订单ID
     * @return 订单对象（包含房型和酒店名等信息）
     */
    Order selectOrderById(Integer orderId);

    /**
     * 删除订单
     * @param orderId 订单ID
     * @return 删除结果
     */
    boolean deleteOrder(Integer orderId);
}